#ifndef QRCODE_H
#define QRCODE_H

#include <stdint.h>
#include <stdlib.h>

// 纠错级别（与Go代码中定义一致）
typedef enum {
    QR_EC_LEVEL_L = 0,  // 7%纠错能力
    QR_EC_LEVEL_M = 1,  // 15%纠错能力
    QR_EC_LEVEL_Q = 2,  // 25%纠错能力
    QR_EC_LEVEL_H = 3   // 30%纠错能力
} QRErrorCorrectionLevel;

// 错误码（与Go代码中定义一致）
typedef enum {
    QR_SUCCESS = 0,
    QR_ERROR_INVALID_PARAM = 1,    // 参数无效
    QR_ERROR_CREATE_FAILED = 2,    // QR码创建失败
    QR_ERROR_FILE_OPEN = 3,        // 文件打开失败
    QR_ERROR_FILE_WRITE = 4,       // 文件写入失败
    QR_ERROR_UNSUPPORTED_FORMAT = 5 // 不支持的格式
} QRError;

// 图片格式（仅保留PNG和JPG）
typedef enum {
    QR_FORMAT_PNG = 0,
    QR_FORMAT_JPG = 1
} QRFormat;

// QR码对象结构体（C程序无需关心内部实现）
typedef struct {
    void* qr_obj;       // 指向Go内部QR码对象的指针
    int module_count;   // QR码的模块数量（如41x41）
    int module_size;    // 每个模块的像素大小（控制整体尺寸）
    int border;         // 边框的模块数量
} QRCode;

// 跨平台函数导出声明
#ifdef _WIN32
#define QR_EXPORT __declspec(dllimport)
#else
#define QR_EXPORT extern
#endif

// 创建QR码对象
// 参数：
//   data: 要编码的字符串
//   version: 版本（0表示自动选择）
//   ecl: 纠错级别（QR_EC_LEVEL_*）
//   border: 边框模块数
//   module_size: 每个模块的像素大小
// 返回：
//   QRCode指针（失败返回NULL）
QR_EXPORT QRCode* qr_create(const char* data, int version, QRErrorCorrectionLevel ecl, int border, int module_size);

// 在终端中显示QR码
// 参数：
//   qr: qr_create返回的QR码对象
// 返回：
//   错误码（QR_SUCCESS表示成功）
QR_EXPORT QRError qr_render_to_terminal(QRCode* qr);

// 将QR码保存为图片文件
// 参数：
//   qr: qr_create返回的QR码对象
//   filename: 保存的文件名
//   format: 图片格式（QR_FORMAT_PNG或QR_FORMAT_JPG）
// 返回：
//   错误码（QR_SUCCESS表示成功）
QR_EXPORT QRError qr_save_to_file(QRCode* qr, const char* filename, QRFormat format);

// 获取QR码图片的宽度（像素）
// 参数：
//   qr: QR码对象
// 返回：
//   宽度像素值（失败返回0）
QR_EXPORT int qr_get_width(QRCode* qr);

// 获取QR码图片的高度（像素）
// 参数：
//   qr: QR码对象
// 返回：
//   高度像素值（失败返回0）
QR_EXPORT int qr_get_height(QRCode* qr);

// 释放QR码对象占用的内存
// 参数：
//   qr: 要释放的QR码对象
QR_EXPORT void qr_destroy(QRCode* qr);

#endif // QRCODE_H